package com.wei.czz.common.po;

import com.fasterxml.jackson.annotation.JsonInclude;
import com.wei.czz.common.tool.BaseEntity;
import lombok.*;

/**
 * Created by IntelliJ IDEA.
 *
 * @author wei
 * date: 2021-05-11 16:50:00
 * className: CountOptPo 用户操作统计类
 * version: 1.0
 * description:
 *   `@JsonInclude(JsonInclude.Include.NON_NULL)`：接口返回对象时，如果某个字段值为空，序列化不操作该字段
 *
 *   注意：此类只在系统内部使用
 */
@Getter
@Setter
@NoArgsConstructor
@JsonInclude(JsonInclude.Include.NON_NULL)
public class CountOptPo extends BaseEntity {

    /**
     * 操作总数
     * 每次操作请求，值自增加一
     * 如果一分钟内用户请求超过阈值，则锁定用户，拒绝该用户访问
     */
    private Integer requestCount;

    /**
     * 最近连续操作次数
     * 如果两次操作时间间隔小于2秒，则值自增加一
     * 用户连续请求超过阈值，则锁定用户，拒绝该用户访问
     */
    private Integer lastCount;

    /**
     * 错误次数
     * 如果一分钟内用户请求超过阈值，则锁定用户，拒绝该用户访问
     */
    private Integer failCount;

    /**
     * 首次操作时间（时间毫秒数字）
     */
    private Long firstOptTime;

    /**
     * 最后一次操作时间（时间毫秒数字）
     */
    private Long lastOptTime;

    /**
     * 用户解除锁定时间（时间毫秒数字）
     * 1、如果一分钟内，用户请求次数大于等于60，即countOpt>=60
     * 2、如果用户连续请求次数大于等于7，即lastCount>=7
     * 满足上述两种情况之一，用户将被锁定一分钟
     */
    private Long unlockTime;

    public CountOptPo(Integer requestCount, Integer lastCount, Integer failCount, Long firstOptTime, Long lastOptTime) {
        this.requestCount = requestCount;
        this.lastCount = lastCount;
        this.failCount = failCount;
        this.firstOptTime = firstOptTime;
        this.lastOptTime = lastOptTime;
    }
}
